home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / FPSE_src / system / amiga / plugin / spu / spu.c < prev   
Encoding:
C/C++ Source or Header  |  2000-01-01  |  1.1 KB  |  61 lines

  1. #include "fpse.h"
  2.  
  3. #define RAMADDR(addr) ((void*)&ram[(addr)&0x1fffff])
  4.  
  5. static int spu_sbaddr;
  6. static INT16 spureg[(0x1e00-0x1c00)/2];
  7. static INT16 *spumem;
  8.  
  9. int SPU_Open(UINT32 *par)
  10. {
  11.     spumem = (INT16 *)malloc(512*1024);
  12.     if (spumem == NULL) return FPSE_ERR;
  13.  
  14.     return FPSE_OK;
  15. }
  16.  
  17. void SPU_Close()
  18. {
  19.     free(spumem);
  20. }
  21.  
  22. int SPU_Read(UINT32 adr)
  23. {
  24.     switch(adr){
  25.     default:
  26.         return spureg[(adr-0x1f801c00)/2];
  27.     }
  28.     return 0;
  29. }
  30.  
  31. void SPU_Write(UINT32 adr, unsigned int data)
  32. {
  33.     spureg[(adr-0x1f801c00)/2] = data;
  34.     switch(adr) {
  35.     case 0x1f801da6: /* spu sbaddr */
  36.         spu_sbaddr = data*4;
  37.         break;
  38.     case 0x1f801da8: /* spu data */
  39. //      if ((spu_reg0&0x30)==0x10) {
  40.             /* non dma mode */
  41.             spumem[spu_sbaddr++]=data;
  42.             return;
  43. //      }
  44.         break;
  45.     }
  46. }
  47.  
  48. void SPU_DmaExec(UINT32 adr,UINT32 bcr,UINT32 chcr)
  49. {
  50.     int size;
  51.  
  52.     size = (bcr>>16)*(bcr&0xffff);
  53.     switch(chcr) {
  54.     case 0x01000201:
  55.         memcpy(spumem+spu_sbaddr,RAMADDR(adr),size*4);
  56.         break;
  57.     case 0x01000200:
  58.         memcpy(RAMADDR(adr),spumem+spu_sbaddr,size*4);
  59.         break;
  60.     }
  61. }